<?php
/**
 * 選手管理データクラスモジュール
 */
require_once dirname(__FILE__) . '/Controller.php';
/**
 * 選手管理データクラス
 * ：チーム運営用に保護者、住所、電話番号をデーターに追加
 * @author admin
 *
 */
class Models_Players_Stuffcontroller extends Models_Players_Controller
{
	/** 保護者 */
	const KEY_GUARDIAN ="GUARDIAN";
	/** 住所 */
	const KEY_ADDRESS = "ADDRESS";
	/** 電話番号 */
	const KEY_TEL = "TEL";
	/** 削除フラグ */
	const KEY_DELFLG = "DELFLG";
	/** 暗号化フラグ */
	const KEY_ENCODEFLG = "ENCODEFLG";

	/** 選手名暗号鍵 */
	const VALUE_PLAYER_ENCODEKEY = '選手サッカー';

	/** 暗号鍵 */
	protected $_strEncodeKey;

	/**
	 * コンストラクタ
	 * @param string $strEncodeKey	暗号化鍵
	 */
	public function __construct($strEncodeKey='')
	{
		$this->_strEncodeKey = '';
		if ( $strEncodeKey == '' ) {
			return;
		}
		$this->setEncodeKey($strEncodeKey);
	}

	/**
	 * 暗号化鍵を設定する
	 *
	 * @param string $strEncodeKey 暗号化鍵
	 */
	public function setEncodeKey($strEncodeKey)
	{
		$this->_strEncodeKey = $strEncodeKey;
		if ( !file_exists(dirname(__FILE__) . '/testenc.txt') ) {
			$sEncodedTxt = $this->encode('サッカー選手', $this->_strEncodeKey);
			file_put_contents(dirname(__FILE__).'/testenc.txt', $sEncodedTxt);
		}
	}

	/**
	 * 指定暗号鍵が正しい暗号鍵かテストする
	 */
	public function testEncodeKey()
	{
		/***
		 * 暗号鍵が未設定の場合ＦＡＬＳＥ
		 */
		if ( $this->_strEncodeKey == '' ) {
			return FALSE;
		}

		/***
		 * 判定文字保存ファイルがなければＦＡＬＳＥ
		 */
		if ( !file_exists(dirname(__FILE__).'/testenc.txt')) {
			return FALSE;
		}

		$sLoadText = file_get_contents(dirname(__FILE__).'/testenc.txt');
		$sEncodedText = $this->encode('サッカー選手', $this->_strEncodeKey);
		if ( $sLoadText != $sEncodedText ) {
			$this->_strEncodeKey = '';
			return FALSE;
		}
		return TRUE;
	}

	/**
	 * 暗号化する
	 * @param string $strName		氏名
	 * @param string $strAddress		住所
	 * @param string $strTel			電話番号
	 * @param string $strGuardian	保護者氏名
	 */
	protected function encodeData(&$strName, &$strAddress, &$strTel, &$strGuardian)
	{
		/***
		 * 選手名はプログラム指定の暗号鍵でエンコードする
		 */
		$strName = $this->encode($strName, self::VALUE_PLAYER_ENCODEKEY);

		$strAddress = $this->encode($strAddress, $this->_strEncodeKey);
		$strTel = $this->encode($strTel, $this->_strEncodeKey);
		$strGuardian = $this->encode($strGuardian, $this->_strEncodeKey);
	}

	/**
	 * 複合化する
	 * @param string $strName 氏名
	 * @param string $strAddress 住所
	 * @param string $strTel 電話番号
	 * @param string $strGuardian 保護者氏名
	 */
	protected function decodeData(&$strName, &$strAddress, &$strTel, &$strGuardian)
	{
		/*************************
		 * 暗号鍵が設定されていなければなにもしない
		 */
		if ( $this->_strEncodeKey == '' ){
			return;
		}
		/***
		 * 選手名はプログラム指定の暗号鍵でデコードする
		 */
		$strName = $this->decode($strName, self::VALUE_PLAYER_ENCODEKEY);

		$strAddress = $this->decode($strAddress, $this->_strEncodeKey);
		$strTel = $this->decode($strTel, $this->_strEncodeKey);
		$strGuardian = $this->decode($strGuardian, $this->_strEncodeKey);
	}

	/**
	 * 選手を追加する
	 * Enter description here ...
	 * @param string $strAge			年齢
	 * @param string $strName		氏名
	 * @param string $strNicName	ニックネーム
	 * @param string $strAddress		住所
	 * @param string $strTel			電話番号
	 * @param string $strGuardian	保護者名
	 * @param string $strEncodeFlg	暗号化フラグ
	 */
	public function add($strAge, $strName, $strNicName, $strAddress, $strTel, $strGuardian, $bEncoded=TRUE)
	{
		$strEncodeFlg = '';
		if ( $this->_strEncodeKey != '' ) {
			if ( $bEncoded != TRUE ) {
				$this->encodeData($strName, $strAddress, $strTel, $strGuardian);
			}
			$strEncodeFlg = '1';
		}
		$strId = self::createId();
        $aryDataset = array(
            self::KEY_ID    => $strId,
            self::KEY_AGE   => $strAge,
            self::KEY_NAME  => $strName,
            self::KEY_NICNAME => $strNicName,
            self::KEY_ADDRESS => $strAddress,
            self::KEY_TEL => $strTel,
            self::KEY_GUARDIAN => $strGuardian,
            self::KEY_ENCODEFLG => $strEncodeFlg,
            self::KEY_DELFLG => '0'
        );

        $this->_aryDataList[] = $aryDataset;
	}

	/**
	 * 指定IDのエントリを更新する
	 * @see Models_Players_Controller::update()
	 * @param $strNicName ニックネーム
	 * @param $strTel 電話番号
	 * @param $strGuardian 保護者氏名
	 * @param $strEncodeKey 暗号化キー
	 */
	public function update($strId, $strAge, $strName, $strNicName, $strAddress, $strTel, $strGuardian, $bEncoded=TRUE)
	{
		$strEncodeFlg = '';
		/***
		 * 暗号化要求判定
		 */
		if ( $this->_strEncodeKey != '' ) {
			if ( $bEncoded != TRUE ) {
				// 暗号化
				$this->encodeData($strName, $strAddress, $strTel, $strGuardian);
			}
			$strEncodeFlg = '1';
		}

		/***
		 * 更新
		 * 更新する対象がなければインサート
		 */
		$aryData = &$this->search(self::KEY_ID, $strId);
    	if ( $aryData === FALSE ) {
    		$this->add($strAge, $strName, $strNicName, $strAddress, $strTel, $strGuardian);
    	} else {
    		$aryData[self::KEY_AGE] = $strAge;
    		$aryData[self::KEY_NAME] = $strName;
    		$aryData[self::KEY_NICNAME] = $strNicName;
    		$aryData[self::KEY_ADDRESS] = $strAddress;
    		$aryData[self::KEY_TEL] = $strTel;
    		$aryData[self::KEY_GUARDIAN] = $strGuardian;
    		$aryData[self::KEY_ENCODEFLG] = $strEncodeFlg;
    	}
	}

	/**
	 * メンバー削除
	 * 論理削除
	 * @see Models_Players_Controller::delete()
	 */
	public function delete($strId)
	{
    	$aryData = &$this->search(self::KEY_ID, $strId);
    	if ( $aryData === FALSE ) {
			return FALSE;
    	}
    	$aryData[self::KEY_DELFLG] = '1';
	}

	/**
	 * 選手データリスト取得
	 * ：論理削除対応
	 * @see Models_Players_Controller::getPlayerList()
	 */
	 public function getPlayerList( $arySelectAgeList='' )
	 {
	 	/***
	 	 * 読み込み
	 	 */
	 	$aryResult = parent::getPlayerList($arySelectAgeList);
	 	$iResultCount = count($aryResult);
	 	$i = 0;
	 	while ( $i < $iResultCount ) {
	 		if ( isset($aryResult[$i][self::KEY_DELFLG]) ) {
	 			if ( $aryResult[$i][self::KEY_DELFLG] == '1' ) {
	 				unset($aryResult[$i]);
	 			}
	 		}
	 		$i ++;
	 	}
	 	$aryResult = array_merge($aryResult);

	 	/***
	 	 * 複合
	 	 */
	 	$iResultCount = count($aryResult);
	 	$i = 0;
	 	while ( $i < $iResultCount ) {
	 		/***
	 		 * 暗号化判定
	 		 */
	 		if ( isset($aryResult[$i][self::KEY_ENCODEFLG]) ) {
	 			if ( $aryResult[$i][self::KEY_ENCODEFLG] == '1' ) {
	 				// 複合化
	 				$this->decodeData(
	 					$aryResult[$i][self::KEY_NAME],
	 					$aryResult[$i][self::KEY_ADDRESS],
	 					$aryResult[$i][self::KEY_TEL],
	 					$aryResult[$i][self::KEY_GUARDIAN]
	 				);
	 			}
	 		}
	 		$i ++;
	 	}

	 	return $aryResult;
	 }
}